class Solution {
    public int findShortestSubArray(int[] nums) {
        // 用 count 来保存数组中每个数出现的次数，次数最多的那个，就是数组的度
        HashMap<Integer,Integer> count = new HashMap<Integer,Integer>();
        // 由于所求子数组的度与原数组相同，这个最短子数组的起始位置和终止位置，就是原数组度对应元素，既子数组的头和尾由两个相同的元素构成
        // 所以使用两个map，分别存放数组中元素第一次和最后一次出现的位置
        HashMap<Integer,Integer> left = new HashMap<Integer,Integer>();
        HashMap<Integer,Integer> right = new HashMap<Integer,Integer>();
        int degree = 0;
        for(int i = 0; i < nums.length ; i++){
            // 如果left中，没有当前数，表示第一次遇到，将其加入到集合中
            if(!left.containsKey(nums[i])){
                left.put(nums[i],i);
            }
            // right 为最后一次出现，所以不加判断，若后续有继续出现相同数，则覆盖前数
            right.put(nums[i],i);
            // 更新每个数出现的次数
            int temp = count.getOrDefault(nums[i], 0);
            count.put(nums[i], temp + 1);
            // 更新最大的度
            degree = Math.max(degree, count.get(nums[i]));
        }

        System.out.println(left);
        System.out.println(right);
        System.out.println(count);
        // 记录数组的长度
        int res = nums.length;
        for(Map.Entry<Integer, Integer> entry : count.entrySet()){
            if(degree == entry.getValue()){
                // 比较度最大的数组长度，得出最小的那一个
                res = Math.min(res, right.get(entry.getKey()) - left.get(entry.getKey()) + 1);
            }
            
        }

        return res;
    }
}